(SST) ShlWAPI.pas Version 1.08

Developer Reference
(SST)ShlWAPI HashData Function
Generates a definable length hash from the specified data.
Scope
Global (i.e. this function can be called/accessed from code in any unit that includes/uses (SST)ShlWAPI.pas).
Syntax
function HashData(pbData : Pointer; cbData : DWORD; pbHash : Pointer; cbHash : DWORD) : HRESULT;
Parameters
pbData [in] Address of (or pointer to) the data from/for which to generate the hash.
cbData [in] Length, in number of bytes, of the data from/for which to generate the hash.
pbHash [in/out] Pointer to a buffer into which the function should write the generated hash. The size of this buffer should at least be that of the desired, hash length (i.e. that specified in the cbHash parameter).
cbHash [in] Desired size/length, in number of bytes, of the hash the function should generate. This must be a value greater than or equal to one (1) and should not exceed 256. But, see remarks, below.
Return Values
If the function succeeds it returns S_OK (= 0) and writes a hash, in the desired length, into the provided buffer. If the function fails, it returns a COM/OLE defined error, typically 0x80070057 (synonymous with ERROR_INVALID_PARAMETER).
Remarks
The function does not return an error, even when called with the parameters cbData and cbData set to zero (0).
The official, Microsoft documentation of the function appears to be erroneous in certain aspects, it is also slightly misleading in others. For example, read in the context of the entire, official, Microsoft, documentation, the first parameter could also be interpreted as a pointer to an array of pointers to the data, from which the hash is generated.
At the time this function was documented by us (July, 2023), the cryptographic service provider(s) and therefore the algorithm(s) used to generate the hash remain to be determined. However, it stands to reason that because of previous and current, U.S. government, export restrictions, the default, Cryptographic Service Provider (CSP) is used, this being both, variable and configurable (see Microsoft documentation on CryptGetDefaultProvider, etc.). If this assumption is correct, the algorithm used to generate the hash depends on the Windows version (i.e. the year of release), the language and the export restrictions that may have applied to the operating system at the time, and/or those that may still apply to the pertinent updates/service packs.
At least under Windows 10 and Windows Vista, the upper limit of 256 bytes for the generated hash does not seem to apply. Under the ShlWAPI.dll versions of these operating system versions, the function not only does not return an error, but also returns a hash of the desired length, even if this execeeds 256. However, our tests were limited to these two Windows versions. It is therefore conceivable that the upper limit does apply to earlier ShlWAPI.dll implementations, which remains to be clarified.
The first, offline documentation, in which the function was documented, was more precise than that currently available, in that it stated correctly that the function is available as of Windows NT 4.0 and 95 with IE 5.0. Our research confirmed that it is available under all systems with Internet Explorer (IE) 5.0 and later.
Example
PROCEDURE TForm4.TestShlWAPIHashData(Sender : TObject); VAR strdatatohash : STRING; VAR datatohashsize : INTEGER; VAR datatohasharrayp : POINTER; VAR hasharrayp : POINTER; VAR dataarraylen : DWORD; VAR hashlen : DWORD; VAR apiretval : HRESULT; VAR newinfoline : STRING; VAR i : DWORD; BEGIN strdatatohash := ''; datatohashsize := 0; datatohasharrayp := NIL; hasharrayp := NIL; dataarraylen := 0; hashlen := 0; apiretval := 0; //S_OK; newinfoline := ''; i := 0; //Test #1 strdatatohash := 'A'; datatohashsize := Length(strdatatohash); datatohasharrayp := @strdatatohash[1]; dataarraylen := 1; hashlen := 1; hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); //Test #2 strdatatohash := 'A'; datatohashsize := Length(strdatatohash); datatohasharrayp := @strdatatohash[1]; dataarraylen := 1; hashlen := 2; hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); //Test #3 (try to force an error, 1 !) strdatatohash := 'A'; datatohashsize := 0; datatohasharrayp := @strdatatohash[1]; dataarraylen := 1; hashlen := 0; hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); //Test #4 (try to force an error, 2 !) strdatatohash := ''; datatohashsize := 0; datatohasharrayp := NIL; dataarraylen := 1; hashlen := 0; hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); //Test #5 strdatatohash := 'The quick, brown fox jumped over the fence and hid in the fox burrow'; datatohashsize := Length(strdatatohash); datatohasharrayp := @strdatatohash[1]; dataarraylen := datatohashsize; hashlen := 1; hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); //Test #6 strdatatohash := 'The quick, brown fox jumped over the fence and hid in the fox burrow'; datatohashsize := Length(strdatatohash); datatohasharrayp := @strdatatohash[1]; dataarraylen := datatohashsize; hashlen := 4; hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); //Test #7 strdatatohash := 'The quick, brown fox jumped over the fence and hid in the fox burrow'; datatohashsize := Length(strdatatohash); datatohasharrayp := @strdatatohash[1]; dataarraylen := datatohashsize; hashlen := datatohashsize; hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO BEGIN IF ((i mod 8) = 0) THEN newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') ' + #13 + #10 ELSE newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); //Test #8 (try to force an error, 3 !) strdatatohash := 'The quick, brown fox jumped over the fence and hid in the fox burrow'; datatohashsize := Length(strdatatohash); datatohasharrayp := @strdatatohash[1]; dataarraylen := datatohashsize; hashlen := 512; //Twice the permissible limit hasharrayp := AllocMem(hashlen + 1); ZeroMemory(hasharrayp, hashlen + 1); newinfoline := 'Calling HashData with parameters:'; Memo1.Lines.Add(newinfoline); newinfoline := 'pbData : 0x' + IntToHex(INTEGER(datatohasharrayp), 8) + ' derefernced : "' + PChar(datatohasharrayp) + '"'; Memo1.Lines.Add(newinfoline); newinfoline := 'cbData : ' + IntToStr(datatohashsize); Memo1.Lines.Add(newinfoline); newinfoline := 'pbHash : 0x' + IntToHex(INTEGER(hasharrayp), 8) ; Memo1.Lines.Add(newinfoline); newinfoline := 'cbHash : '+ IntToStr(hashlen); Memo1.Lines.Add(newinfoline); apiretval := HashData(datatohasharrayp, dataarraylen, hasharrayp, hashlen); newinfoline := 'HashData returned : '; newinfoline := newinfoline + IntToStr(apiretval) + ' (0x' + IntToHex(apiretval, 8) + ')'; Memo1.Lines.Add(newinfoline); newinfoline := 'The hashed data returned by the function is :'; Memo1.Lines.Add(newinfoline); newinfoline := ''; IF (apiretval = S_OK) AND (hashlen > 0) THEN BEGIN FOR i := 0 TO (hashlen - 1) DO BEGIN IF ((i mod 8) = 0) THEN newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') ' + #13 + #10 ELSE newinfoline := newinfoline + IntToStr(PByteArray(hasharrayp)^[i]) + ' (0x' + IntToHex(PByteArray(hasharrayp)^[i], 2) + ') '; END; END; Memo1.Lines.Add(newinfoline); FreeMem(hasharrayp); Memo1.Lines.Add(''); END;
When run on the systems under which the above, sample code was developed and tested (Windows Vista & Windows 10), we received the following output:
Calling HashData with parameters: pbData : 0x02465508 derefernced : "A" cbData : 1 pbHash : 0x024777A4 cbHash : 1 HashData returned : 0 (0x00000000) The hashed data returned by the function is : 161 (0xA1) Calling HashData with parameters: pbData : 0x02465508 derefernced : "A" cbData : 1 pbHash : 0x02474C24 cbHash : 2 HashData returned : 0 (0x00000000) The hashed data returned by the function is : 161 (0xA1) 176 (0xB0) Calling HashData with parameters: pbData : 0x02465508 derefernced : "A" cbData : 0 pbHash : 0x02463B40 cbHash : 0 HashData returned : 0 (0x00000000) The hashed data returned by the function is : Calling HashData with parameters: pbData : 0x00000000 derefernced : "" cbData : 0 pbHash : 0x024664F0 cbHash : 0 HashData returned : -2147024809 (0x80070057) The hashed data returned by the function is : Calling HashData with parameters: pbData : 0x02479ED8 derefernced : "The quick, brown fox jumped over the fence and hid in the fox burrow" cbData : 68 pbHash : 0x024777A4 cbHash : 1 HashData returned : 0 (0x00000000) The hashed data returned by the function is : 84 (0x54) Calling HashData with parameters: pbData : 0x02479ED8 derefernced : "The quick, brown fox jumped over the fence and hid in the fox burrow" cbData : 68 pbHash : 0x02474C24 cbHash : 4 HashData returned : 0 (0x00000000) The hashed data returned by the function is : 84 (0x54) 86 (0x56) 160 (0xA0) 13 (0x0D) Calling HashData with parameters: pbData : 0x02479ED8 derefernced : "The quick, brown fox jumped over the fence and hid in the fox burrow" cbData : 68 pbHash : 0x0247A254 cbHash : 68 HashData returned : 0 (0x00000000) The hashed data returned by the function is : 84 (0x54) 86 (0x56) 160 (0xA0) 13 (0x0D) 42 (0x2A) 178 (0xB2) 59 (0x3B) 6 (0x06) 97 (0x61) 146 (0x92) 34 (0x22) 209 (0xD1) 2 (0x02) 25 (0x19) 15 (0x0F) 68 (0x44) 248 (0xF8) 155 (0x9B) 191 (0xBF) 16 (0x10) 188 (0xBC) 55 (0x37) 231 (0xE7) 217 (0xD9) 165 (0xA5) 46 (0x2E) 244 (0xF4) 102 (0x66) 114 (0x72) 135 (0x87) 243 (0xF3) 21 (0x15) 151 (0x97) 138 (0x8A) 35 (0x23) 164 (0xA4) 12 (0x0C) 91 (0x5B) 56 (0x38) 206 (0xCE) 72 (0x48) 152 (0x98) 170 (0xAA) 197 (0xC5) 234 (0xEA) 210 (0xD2) 219 (0xDB) 198 (0xC6) 96 (0x60) 179 (0xB3) 237 (0xED) 53 (0x35) 120 (0x78) 77 (0x4D) 207 (0xCF) 115 (0x73) 149 (0x95) 171 (0xAB) 30 (0x1E) 69 (0x45) 78 (0x4E) 137 (0x89) 76 (0x4C) 166 (0xA6) 66 (0x42) 49 (0x31) 118 (0x76) 104 (0x68) Calling HashData with parameters: pbData : 0x02479ED8 derefernced : "The quick, brown fox jumped over the fence and hid in the fox burrow" cbData : 68 pbHash : 0x02461C8C cbHash : 512 HashData returned : 0 (0x00000000) The hashed data returned by the function is : 84 (0x54) 86 (0x56) 160 (0xA0) 13 (0x0D) 42 (0x2A) 178 (0xB2) 59 (0x3B) 6 (0x06) 97 (0x61) 146 (0x92) 34 (0x22) 209 (0xD1) 2 (0x02) 25 (0x19) 15 (0x0F) 68 (0x44) 248 (0xF8) 155 (0x9B) 191 (0xBF) 16 (0x10) 188 (0xBC) 55 (0x37) 231 (0xE7) 217 (0xD9) 165 (0xA5) 46 (0x2E) 244 (0xF4) 102 (0x66) 114 (0x72) 135 (0x87) 243 (0xF3) 21 (0x15) 151 (0x97) 138 (0x8A) 35 (0x23) 164 (0xA4) 12 (0x0C) 91 (0x5B) 56 (0x38) 206 (0xCE) 72 (0x48) 152 (0x98) 170 (0xAA) 197 (0xC5) 234 (0xEA) 210 (0xD2) 219 (0xDB) 198 (0xC6) 96 (0x60) 179 (0xB3) 237 (0xED) 53 (0x35) 120 (0x78) 77 (0x4D) 207 (0xCF) 115 (0x73) 149 (0x95) 171 (0xAB) 30 (0x1E) 69 (0x45) 78 (0x4E) 137 (0x89) 76 (0x4C) 166 (0xA6) 66 (0x42) 49 (0x31) 118 (0x76) 104 (0x68) 109 (0x6D) 134 (0x86) 44 (0x2C) 205 (0xCD) 140 (0x8C) 43 (0x2B) 93 (0x5D) 51 (0x33) 62 (0x3E) 3 (0x03) 145 (0x91) 172 (0xAC) 163 (0xA3) 183 (0xB7) 167 (0xA7) 190 (0xBE) 117 (0x75) 187 (0xBB) 74 (0x4A) 122 (0x7A) 251 (0xFB) 159 (0x9F) 249 (0xF9) 176 (0xB0) 208 (0xD0) 18 (0x12) 57 (0x39) 26 (0x1A) 211 (0xD3) 220 (0xDC) 228 (0xE4) 110 (0x6E) 153 (0x99) 131 (0x83) 147 (0x93) 60 (0x3C) 39 (0x27) 136 (0x88) 47 (0x2F) 201 (0xC9) 235 (0xEB) 133 (0x85) 94 (0x5E) 141 (0x8D) 63 (0x3F) 28 (0x1C) 50 (0x32) 130 (0x82) 48 (0x30) 199 (0xC7) 232 (0xE8) 194 (0xC2) 240 (0xF0) 247 (0xF7) 186 (0xBA) 1 (0x01) 204 (0xCC) 64 (0x40) 218 (0xDA) 79 (0x4F) 253 (0xFD) 154 (0x9A) 83 (0x53) 169 (0xA9) 226 (0xE2) 71 (0x47) 150 (0x96) 54 (0x36) 41 (0x29) 246 (0xF6) 127 (0x7F) 106 (0x6A) 81 (0x51) 192 (0xC0) 223 (0xDF) 99 (0x63) 7 (0x07) 174 (0xAE) 17 (0x11) 22 (0x16) 222 (0xDE) 239 (0xEF) 31 (0x1F) 182 (0xB6) 113 (0x71) 148 (0x94) 202 (0xCA) 111 (0x6F) 142 (0x8E) 241 (0xF1) 116 (0x74) 230 (0xE6) 105 (0x69) 189 (0xBD) 123 (0x7B) 82 (0x52) 200 (0xC8) 103 (0x67) 143 (0x8F) 233 (0xE9) 27 (0x1B) 215 (0xD7) 214 (0xD6) 242 (0xF2) 37 (0x25) 73 (0x49) 236 (0xEC) 75 (0x4B) 255 (0xFF) 173 (0xAD) 119 (0x77) 100 (0x64) 185 (0xB9) 128 (0x80) 98 (0x62) 95 (0x5F) 9 (0x09) 45 (0x2D) 58 (0x3A) 181 (0xB5) 4 (0x04) 19 (0x13) 139 (0x8B) 144 (0x90) 250 (0xFA) 238 (0xEE) 112 (0x70) 212 (0xD4) 32 (0x20) 125 (0x7D) 168 (0xA8) 213 (0xD5) 89 (0x59) 87 (0x57) 203 (0xCB) 196 (0xC4) 29 (0x1D) 121 (0x79) 8 (0x08) 108 (0x6C) 33 (0x21) 61 (0x3D) 67 (0x43) 85 (0x55) 90 (0x5A) 65 (0x41) 184 (0xB8) 126 (0x7E) 124 (0x7C) 252 (0xFC) 38 (0x26) 229 (0xE5) 132 (0x84) 157 (0x9D) 88 (0x58) 107 (0x6B) 14 (0x0E) 158 (0x9E) 11 (0x0B) 10 (0x0A) 80 (0x50) 193 (0xC1) 245 (0xF5) 221 (0xDD) 20 (0x14) 0 (0x00) 225 (0xE1) 40 (0x28) 52 (0x34) 254 (0xFE) 5 (0x05) 156 (0x9C) 162 (0xA2) 36 (0x24) 24 (0x18) 70 (0x46) 195 (0xC3) 224 (0xE0) 129 (0x81) 177 (0xB1) 175 (0xAF) 216 (0xD8) 161 (0xA1) 101 (0x65) 180 (0xB4) 92 (0x5C) 227 (0xE3) 23 (0x17) 84 (0x54) 86 (0x56) 160 (0xA0) 13 (0x0D) 42 (0x2A) 178 (0xB2) 59 (0x3B) 6 (0x06) 97 (0x61) 146 (0x92) 34 (0x22) 209 (0xD1) 2 (0x02) 25 (0x19) 15 (0x0F) 68 (0x44) 248 (0xF8) 155 (0x9B) 191 (0xBF) 16 (0x10) 188 (0xBC) 55 (0x37) 231 (0xE7) 217 (0xD9) 165 (0xA5) 46 (0x2E) 244 (0xF4) 102 (0x66) 114 (0x72) 135 (0x87) 243 (0xF3) 21 (0x15) 151 (0x97) 138 (0x8A) 35 (0x23) 164 (0xA4) 12 (0x0C) 91 (0x5B) 56 (0x38) 206 (0xCE) 72 (0x48) 152 (0x98) 170 (0xAA) 197 (0xC5) 234 (0xEA) 210 (0xD2) 219 (0xDB) 198 (0xC6) 96 (0x60) 179 (0xB3) 237 (0xED) 53 (0x35) 120 (0x78) 77 (0x4D) 207 (0xCF) 115 (0x73) 149 (0x95) 171 (0xAB) 30 (0x1E) 69 (0x45) 78 (0x4E) 137 (0x89) 76 (0x4C) 166 (0xA6) 66 (0x42) 49 (0x31) 118 (0x76) 104 (0x68) 109 (0x6D) 134 (0x86) 44 (0x2C) 205 (0xCD) 140 (0x8C) 43 (0x2B) 93 (0x5D) 51 (0x33) 62 (0x3E) 3 (0x03) 145 (0x91) 172 (0xAC) 163 (0xA3) 183 (0xB7) 167 (0xA7) 190 (0xBE) 117 (0x75) 187 (0xBB) 74 (0x4A) 122 (0x7A) 251 (0xFB) 159 (0x9F) 249 (0xF9) 176 (0xB0) 208 (0xD0) 18 (0x12) 57 (0x39) 26 (0x1A) 211 (0xD3) 220 (0xDC) 228 (0xE4) 110 (0x6E) 153 (0x99) 131 (0x83) 147 (0x93) 60 (0x3C) 39 (0x27) 136 (0x88) 47 (0x2F) 201 (0xC9) 235 (0xEB) 133 (0x85) 94 (0x5E) 141 (0x8D) 63 (0x3F) 28 (0x1C) 50 (0x32) 130 (0x82) 48 (0x30) 199 (0xC7) 232 (0xE8) 194 (0xC2) 240 (0xF0) 247 (0xF7) 186 (0xBA) 1 (0x01) 204 (0xCC) 64 (0x40) 218 (0xDA) 79 (0x4F) 253 (0xFD) 154 (0x9A) 83 (0x53) 169 (0xA9) 226 (0xE2) 71 (0x47) 150 (0x96) 54 (0x36) 41 (0x29) 246 (0xF6) 127 (0x7F) 106 (0x6A) 81 (0x51) 192 (0xC0) 223 (0xDF) 99 (0x63) 7 (0x07) 174 (0xAE) 17 (0x11) 22 (0x16) 222 (0xDE) 239 (0xEF) 31 (0x1F) 182 (0xB6) 113 (0x71) 148 (0x94) 202 (0xCA) 111 (0x6F) 142 (0x8E) 241 (0xF1) 116 (0x74) 230 (0xE6) 105 (0x69) 189 (0xBD) 123 (0x7B) 82 (0x52) 200 (0xC8) 103 (0x67) 143 (0x8F) 233 (0xE9) 27 (0x1B) 215 (0xD7) 214 (0xD6) 242 (0xF2) 37 (0x25) 73 (0x49) 236 (0xEC) 75 (0x4B) 255 (0xFF) 173 (0xAD) 119 (0x77) 100 (0x64) 185 (0xB9) 128 (0x80) 98 (0x62) 95 (0x5F) 9 (0x09) 45 (0x2D) 58 (0x3A) 181 (0xB5) 4 (0x04) 19 (0x13) 139 (0x8B) 144 (0x90) 250 (0xFA) 238 (0xEE) 112 (0x70) 212 (0xD4) 32 (0x20) 125 (0x7D) 168 (0xA8) 213 (0xD5) 89 (0x59) 87 (0x57) 203 (0xCB) 196 (0xC4) 29 (0x1D) 121 (0x79) 8 (0x08) 108 (0x6C) 33 (0x21) 61 (0x3D) 67 (0x43) 85 (0x55) 90 (0x5A) 65 (0x41) 184 (0xB8) 126 (0x7E) 124 (0x7C) 252 (0xFC) 38 (0x26) 229 (0xE5) 132 (0x84) 157 (0x9D) 88 (0x58) 107 (0x6B) 14 (0x0E) 158 (0x9E) 11 (0x0B) 10 (0x0A) 80 (0x50) 193 (0xC1) 245 (0xF5) 221 (0xDD) 20 (0x14) 0 (0x00) 225 (0xE1) 40 (0x28) 52 (0x34) 254 (0xFE) 5 (0x05) 156 (0x9C) 162 (0xA2) 36 (0x24) 24 (0x18) 70 (0x46) 195 (0xC3) 224 (0xE0) 129 (0x81) 177 (0xB1) 175 (0xAF) 216 (0xD8) 161 (0xA1) 101 (0x65) 180 (0xB4) 92 (0x5C) 227 (0xE3) 23 (0x17)
Requirements
Unit: Declared and imported in (SST)ShlWAPI.pas
Library: (SST)ShlWAPI.dcu/(SST)ShlWAPI.obj
Unicode: Not applicable.
Min. ShlWAPI.dll version according to MS SDK doc.: 5.0
Min. ShlWAPI.dll version based on SST research: 5.0
Min. OS version(s) according to Microsoft SDK doc.: Windows 2000, Windows NT 4.0 with Internet Explorer 5, Windows 98, Windows 95 with Internet Explorer 5
Min. OS version(s) according to SST research.: NT 4.0 with IE 5, Windows 98, Windows 95 with IE 5, Windows 2000 and later
See Also
UrlHash.
 
Windows APIs: HashData, UrlHas.


Document/Contents version 1.00
Page/URI last updated on 07.12.2023
 
Copyright © Stoelzel Software Technologie (SST) 2010 - 2015
Suggestions and comments mail to:
webmaster@stoelzelsoftwaretech.com